package com.cencat.order.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 线路发票视图对象
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@Accessors(chain = true)
public class RouteInvoiceVO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 发票ID
     */
    private Long invoiceId;

    /**
     * 发票编号
     */
    private String invoiceCode;

    /**
     * 发票号码
     */
    private String invoiceNumber;

    /**
     * 发票类型(1-增值税专用发票 2-增值税普通发票 3-电子发票)
     */
    private Integer invoiceType;

    /**
     * 发票类型描述
     */
    private String invoiceTypeDesc;

    /**
     * 发票状态(0-草稿 1-已开具 2-已发送 3-已确认 4-已作废 5-已红冲)
     */
    private Integer invoiceStatus;

    /**
     * 发票状态描述
     */
    private String invoiceStatusDesc;

    /**
     * 路线ID
     */
    private Long routeId;

    /**
     * 路线编号
     */
    private String routeCode;

    /**
     * 路线名称
     */
    private String routeName;

    /**
     * 商家ID
     */
    private Long merchantId;

    /**
     * 商家编号
     */
    private String merchantCode;

    /**
     * 商家名称
     */
    private String merchantName;

    /**
     * 购买方名称
     */
    private String buyerName;

    /**
     * 购买方纳税人识别号
     */
    private String buyerTaxNumber;

    /**
     * 购买方地址电话
     */
    private String buyerAddressPhone;

    /**
     * 购买方开户行及账号
     */
    private String buyerBankAccount;

    /**
     * 销售方名称
     */
    private String sellerName;

    /**
     * 销售方纳税人识别号
     */
    private String sellerTaxNumber;

    /**
     * 销售方地址电话
     */
    private String sellerAddressPhone;

    /**
     * 销售方开户行及账号
     */
    private String sellerBankAccount;

    /**
     * 开票日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate invoiceDate;

    /**
     * 服务期间开始日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate serviceStartDate;

    /**
     * 服务期间结束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate serviceEndDate;

    /**
     * 货物或应税劳务名称
     */
    private String goodsName;

    /**
     * 规格型号
     */
    private String specification;

    /**
     * 单位
     */
    private String unit;

    /**
     * 数量
     */
    private BigDecimal quantity;

    /**
     * 单价
     */
    private BigDecimal unitPrice;

    /**
     * 金额(不含税)
     */
    private BigDecimal amount;

    /**
     * 税率(%)
     */
    private BigDecimal taxRate;

    /**
     * 税额
     */
    private BigDecimal taxAmount;

    /**
     * 价税合计
     */
    private BigDecimal totalAmount;

    /**
     * 价税合计(大写)
     */
    private String totalAmountChinese;

    /**
     * 备注
     */
    private String invoiceRemark;

    /**
     * 收款人
     */
    private String payee;

    /**
     * 复核
     */
    private String reviewer;

    /**
     * 开票人
     */
    private String drawer;

    /**
     * 机器编号
     */
    private String machineCode;

    /**
     * 校验码
     */
    private String checkCode;

    /**
     * 发票文件路径
     */
    private String filePath;

    /**
     * 发票PDF路径
     */
    private String pdfPath;

    /**
     * 发票图片路径
     */
    private String imagePath;

    /**
     * 电子发票URL
     */
    private String electronicUrl;

    /**
     * 二维码内容
     */
    private String qrCode;

    /**
     * 发送状态(0-未发送 1-已发送 2-发送失败)
     */
    private Integer sendStatus;

    /**
     * 发送状态描述
     */
    private String sendStatusDesc;

    /**
     * 发送时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime sendTime;

    /**
     * 发送方式(1-邮件 2-短信 3-微信 4-下载)
     */
    private Integer sendMethod;

    /**
     * 发送方式描述
     */
    private String sendMethodDesc;

    /**
     * 接收邮箱
     */
    private String receiveEmail;

    /**
     * 接收手机号
     */
    private String receivePhone;

    /**
     * 确认状态(0-未确认 1-已确认)
     */
    private Integer confirmStatus;

    /**
     * 确认状态描述
     */
    private String confirmStatusDesc;

    /**
     * 确认时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime confirmTime;

    /**
     * 确认人
     */
    private String confirmBy;

    /**
     * 作废时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime voidTime;

    /**
     * 作废原因
     */
    private String voidReason;

    /**
     * 作废人
     */
    private String voidBy;

    /**
     * 红冲时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime redRushTime;

    /**
     * 红冲原因
     */
    private String redRushReason;

    /**
     * 红冲人
     */
    private String redRushBy;

    /**
     * 原发票ID(红冲时关联)
     */
    private Long originalInvoiceId;

    /**
     * 原发票编号
     */
    private String originalInvoiceCode;

    /**
     * 打印次数
     */
    private Integer printCount;

    /**
     * 最后打印时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastPrintTime;

    /**
     * 模板ID
     */
    private Long templateId;

    /**
     * 模板名称
     */
    private String templateName;

    /**
     * 批次号
     */
    private String batchNumber;

    /**
     * 生成方式(1-单个生成 2-批量生成 3-自动生成)
     */
    private Integer generateMethod;

    /**
     * 生成方式描述
     */
    private String generateMethodDesc;

    /**
     * 审核状态(0-待审核 1-审核通过 2-审核拒绝)
     */
    private Integer auditStatus;

    /**
     * 审核状态描述
     */
    private String auditStatusDesc;

    /**
     * 审核时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime auditTime;

    /**
     * 审核人
     */
    private String auditBy;

    /**
     * 审核意见
     */
    private String auditOpinion;

    /**
     * 归档状态(0-未归档 1-已归档)
     */
    private Integer archiveStatus;

    /**
     * 归档状态描述
     */
    private String archiveStatusDesc;

    /**
     * 归档时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime archiveTime;

    /**
     * 归档路径
     */
    private String archivePath;

    /**
     * 对账状态(0-未对账 1-已对账 2-对账异常)
     */
    private Integer reconcileStatus;

    /**
     * 对账状态描述
     */
    private String reconcileStatusDesc;

    /**
     * 对账时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime reconcileTime;

    /**
     * 对账人
     */
    private String reconcileBy;

    /**
     * 对账结果
     */
    private String reconcileResult;

    /**
     * 扩展信息(JSON格式)
     */
    private String extendInfo;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}